Apache Derby একটি শক্তিশালী ডেটাবেস সিস্টেম যা Stored Procedures এবং Triggers সমর্থন করে, যা ডেটাবেস লজিক এবং স্বয়ংক্রিয় কার্যক্রম পরিচালনা করতে সহায়তা করে। এগুলি ডেটাবেসের মধ্যে অ্যাপ্লিকেশন লজিক সংরক্ষণ করতে এবং বিভিন্ন ডেটাবেস ইভেন্টের জন্য প্রক্রিয়া তৈরি করতে ব্যবহৃত হয়।
Stored Procedure হল একটি প্রোগ্রাম ব্লক যা ডেটাবেসে সংরক্ষিত থাকে এবং একাধিক SQL অপারেশন একত্রে একবারে সম্পাদন করতে ব্যবহৃত হয়। এটি ডেটাবেসে একটি নির্দিষ্ট কার্যাবলী বা লজিক সম্পাদন করার জন্য একটি কুয়েরি বা ফাংশন হিসাবে ব্যবহৃত হয়। যখনই এটি ডেটাবেসে কল করা হয়, তখন এটি কার্যকর হয় এবং ফলাফল প্রদান করে।
Derby-তে Stored Procedure তৈরি করার জন্য CREATE PROCEDURE
স্টেটমেন্ট ব্যবহার করতে হয়। উদাহরণস্বরূপ, যদি আপনি একটি employee টেবিলের একটি কর্মচারীর তথ্য আপডেট করতে চান, তবে একটি স্টোরড প্রসিডিউর তৈরি করতে পারেন:
CREATE PROCEDURE updateEmployeeSalary(
IN employee_id INT,
IN new_salary DECIMAL
)
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'org.apache.derby.storeProcedure.updateSalary'
একবার যখন স্টোরড প্রসিডিউর তৈরি হয়, তখন এটি CALL
স্টেটমেন্টের মাধ্যমে কল করা হয়। উদাহরণ:
CALL updateEmployeeSalary(101, 50000.00);
এটি employee_id
101 এর জন্য salary
আপডেট করবে।
Trigger হল একটি ডেটাবেস অবজেক্ট যা নির্দিষ্ট ডেটাবেস ইভেন্টের সময় স্বয়ংক্রিয়ভাবে চালিত হয়। ডেটাবেসে ডেটা ইনসার্ট, আপডেট বা ডিলিট হওয়ার পরে বা আগে ট্রিগার কল হতে পারে। একটি ট্রিগার সাধারণত ডেটাবেস অপারেশনগুলির সাথে যুক্ত লজিক সম্পাদন করতে ব্যবহৃত হয়।
Derby-তে ট্রিগার তৈরি করতে CREATE TRIGGER
স্টেটমেন্ট ব্যবহার করা হয়। উদাহরণস্বরূপ, যদি আপনি চান যে, যখন কোনো নতুন কর্মচারী employee টেবিলে যোগ হবে, তখন তাদের সাথে একটি স্বয়ংক্রিয়ভাবে salary_history
টেবিলেও একটি এন্ট্রি করা হোক, তাহলে আপনি এমন একটি ট্রিগার তৈরি করতে পারেন:
CREATE TRIGGER afterEmployeeInsert
AFTER INSERT ON employee
FOR EACH ROW
INSERT INTO salary_history (employee_id, salary, date)
VALUES (NEW.id, NEW.salary, CURRENT_DATE);
এটি employee টেবিলে নতুন একটি রেকর্ড ইনসার্ট হওয়ার পর salary_history টেবিলেও একটি রেকর্ড যোগ করবে।
ট্রিগারগুলি স্বয়ংক্রিয়ভাবে নির্দিষ্ট ডেটাবেস ইভেন্টে (যেমন INSERT
, UPDATE
, বা DELETE
) কল হয়, তাই আপনার ম্যানুয়ালি ট্রিগার কল করার প্রয়োজন নেই। এটি INSERT বা অন্য কোনো SQL অপারেশন সম্পাদিত হওয়ার পর স্বয়ংক্রিয়ভাবে কার্যকর হয়।
বৈশিষ্ট্য | Stored Procedure | Trigger |
---|---|---|
ব্যবহার | এক বা একাধিক SQL অপারেশন চালানোর জন্য | ডেটাবেস ইভেন্ট (INSERT/UPDATE/DELETE) এ কার্যকর |
কোড লেখার স্থান | ডেটাবেস থেকে কল করা হয় | স্বয়ংক্রিয়ভাবে ডেটাবেস ইভেন্টে ট্রিগার হয় |
অপারেশন সময় | ম্যানুয়ালি কল করতে হয় | নির্দিষ্ট ডেটাবেস ইভেন্টে চালিত হয় |
রিটার্ন ভ্যালু | রিটার্ন ভ্যালু থাকতে পারে | কোনো রিটার্ন ভ্যালু নেই |
নির্দিষ্ট কার্যক্রম | নির্দিষ্ট কার্যক্রম সম্পাদন করা | নির্দিষ্ট ডেটাবেস ইভেন্টে কার্যক্রম সম্পাদন |
উদাহরণ | নতুন কর্মচারীর বেতন আপডেট করা | নতুন কর্মচারী যোগ হলে লোগিং করা |
Stored Procedures এবং Triggers দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডেটাবেস লজিক এবং কার্যক্রমকে স্বয়ংক্রিয় এবং কার্যকরী করে তোলে। Stored Procedures একাধিক SQL অপারেশন একত্রে চালানোর জন্য ব্যবহৃত হয়, যেখানে Triggers নির্দিষ্ট ডেটাবেস ইভেন্টে স্বয়ংক্রিয়ভাবে কার্যকর হয়। এই দুটি ফিচার ডেটাবেসের কার্যকারিতা, নিরাপত্তা, এবং স্বয়ংক্রিয়তা বৃদ্ধিতে সহায়ক।
Stored Procedures হল SQL কোডের একটি সেট, যা ডেটাবেসে সংরক্ষিত থাকে এবং ডেটাবেসের মাধ্যমে কল করা যায়। এটি সাধারণত কোনো নির্দিষ্ট কাজ বা কর্মসূচি সম্পাদন করার জন্য ব্যবহৃত হয়, যেমন ডেটা ইনসার্ট, আপডেট, অথবা আরও জটিল লগিকাল অপারেশন।
Apache Derby-এ stored procedure তৈরি এবং ব্যবহার করা সম্ভব, যদিও এটি অন্যান্য ডেটাবেসের তুলনায় কিছুটা সীমিত। তবে আপনি SQL ব্লক এবং Java প্রোগ্রামিং ভাষা ব্যবহার করে stored procedures তৈরি করতে পারেন।
Apache Derby-এ Stored Procedure তৈরি করতে Java ব্যবহার করতে হয়, কারণ Derby SQL-এ শুধুমাত্র Java-based stored procedures সমর্থন করে। Java-based stored procedure একটি Java ক্লাস বা মেথড যা SQL কোয়েরি চালানোর মাধ্যমে ডেটাবেসে কার্যকর হয়।
ধরা যাক, আপনি একটি Stored Procedure তৈরি করতে চান যা একটি employee
টেবিলের মধ্যে id
এর ভিত্তিতে age
আপডেট করবে।
প্রথমে একটি Java ক্লাস তৈরি করুন যা stored procedure হিসেবে কাজ করবে। উদাহরণস্বরূপ, নিচের Java কোডে একটি মেথড তৈরি করা হয়েছে যা employee
টেবিলের age
আপডেট করবে।
import java.sql.*;
public class UpdateEmployeeAge {
public static void updateAge(Connection conn, int employeeId, int newAge) throws SQLException {
String sql = "UPDATE employee SET age = ? WHERE id = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, newAge);
stmt.setInt(2, employeeId);
stmt.executeUpdate();
}
}
}
এখন, আপনি Derby ডেটাবেসে UpdateEmployeeAge
ক্লাসের stored procedure তৈরি করতে পারেন। এটা করার জন্য আপনি java.sql.Connection
এবং CallableStatement
ব্যবহার করবেন।
-- Stored procedure তৈরি করা
CREATE PROCEDURE updateEmployeeAge(IN employeeId INT, IN newAge INT)
LANGUAGE JAVA
PARAMETER STYLE JAVA
DYNAMIC RESULT SETS 0
EXTERNAL NAME 'UpdateEmployeeAge.updateAge';
এটি updateEmployeeAge নামে একটি stored procedure তৈরি করবে, যা employeeId এবং newAge ইনপুট নেয় এবং employee
টেবিলের age
আপডেট করে।
Stored Procedure কল করতে CALL কমান্ড ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হলো, যেখানে আমরা updateEmployeeAge
স্টোরড প্রসিডিউর কল করছি:
-- Stored Procedure কল করা
CALL updateEmployeeAge(1, 35);
এই কমান্ডটি employee
টেবিলের id = 1
এর age
কলাম 35-এ আপডেট করবে।
এখন, আপনি JDBC ব্যবহার করে Java থেকে stored procedure
কল করতে পারেন।
import java.sql.*;
public class CallStoredProcedure {
public static void main(String[] args) {
String url = "jdbc:derby:myDB;create=true"; // ডেটাবেসের URL
try (Connection conn = DriverManager.getConnection(url)) {
// CallableStatement তৈরি করা
String sql = "{call updateEmployeeAge(?, ?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
// ইনপুট প্যারামিটার সেট করা
stmt.setInt(1, 1); // employeeId
stmt.setInt(2, 35); // newAge
// Stored Procedure কল করা
stmt.executeUpdate();
System.out.println("Employee age updated successfully.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
এই Java কোডটি JDBC ব্যবহার করে stored procedure কল করবে, এবং employeeId = 1
এর age
35-এ আপডেট করবে।
আপনি stored procedure-এর মাধ্যমে আউটপুটও ফেরত দিতে পারেন। যেমন, কোনো নির্দিষ্ট id
এর জন্য age
ফিরিয়ে দেওয়ার জন্য আপনি নিচের মতো একটি stored procedure তৈরি করতে পারেন:
public class GetEmployeeAge {
public static int getAge(Connection conn, int employeeId) throws SQLException {
String sql = "SELECT age FROM employee WHERE id = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, employeeId);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return rs.getInt("age");
} else {
return -1; // If no employee found
}
}
}
}
CREATE PROCEDURE getEmployeeAge(IN employeeId INT, OUT employeeAge INT)
LANGUAGE JAVA
PARAMETER STYLE JAVA
DYNAMIC RESULT SETS 0
EXTERNAL NAME 'GetEmployeeAge.getAge';
-- Stored Procedure কল করা এবং আউটপুট নেয়া
CALL getEmployeeAge(1, ?);
Triggers হল ডেটাবেসের অবজারভেবল অবস্থা বা ডেটাবেসের মধ্যে কিছু নির্দিষ্ট পরিবর্তন ঘটলেই স্বয়ংক্রিয়ভাবে কার্যকর হওয়া প্রোগ্রাম। উদাহরণস্বরূপ, আপনি একটি ট্রিগার সেট করতে পারেন যা ডেটাবেসে একটি নতুন রেকর্ড ইনসার্ট হলে বা কোনো রেকর্ড আপডেট হলে কিছু নির্দিষ্ট কাজ সম্পাদন করবে।
Apache Derby ডেটাবেসে Triggers তৈরি ও ব্যবহার করার জন্য SQL কুয়েরি ব্যবহৃত হয়, যেখানে BEFORE বা AFTER কিওয়ার্ড দ্বারা ট্রিগারের টাইপ নির্ধারণ করা হয়।
INSERT
, UPDATE
, বা DELETE
) হওয়ার আগেই ট্রিগারটি কার্যকর হয়। এই ধরনের ট্রিগার ডেটা পরিবর্তনের আগে কিছু যাচাই বা পরিবর্তন করতে ব্যবহৃত হয়।Trigger তৈরি করার সাধারণ সিনট্যাক্স:
CREATE TRIGGER trigger_name
trigger_time trigger_event
ON table_name
[FOR EACH ROW]
[WHEN condition]
BEGIN
-- Trigger action (SQL statements)
END;
trigger_name
: ট্রিগারের নাম।trigger_time
: BEFORE
বা AFTER
– ট্রিগারটি কোন সময় কার্যকর হবে।trigger_event
: INSERT
, UPDATE
, বা DELETE
– ট্রিগারটি কোন অপারেশন ঘটলে কার্যকর হবে।table_name
: টেবিলের নাম যেখানে ট্রিগারটি প্রযোজ্য হবে।condition
: (ঐচ্ছিক) – ট্রিগারটি একটি নির্দিষ্ট শর্তে চালানোর জন্য।trigger action
: ট্রিগারের কাজ যা SQL স্টেটমেন্ট দ্বারা নির্ধারিত হয়।ধরা যাক, আমাদের একটি টেবিল রয়েছে যেটি employees
নামে পরিচিত। আমরা একটি BEFORE INSERT Trigger তৈরি করতে চাই, যাতে ইনসার্ট করার আগে কোনো salary
কলামের মান চেক করা হয় এবং তা ০ এর কম না হয়।
CREATE TRIGGER check_salary_before_insert
BEFORE INSERT
ON employees
FOR EACH ROW
WHEN (NEW.salary < 0)
BEGIN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Salary cannot be negative';
END;
এই ট্রিগারটি তখনই কাজ করবে যখন নতুন রেকর্ড ইনসার্ট করার আগে salary
এর মান নেতিবাচক (negative) হবে, এবং তখন একটি ত্রুটি বার্তা প্রদর্শিত হবে।
ধরা যাক, একটি sales
টেবিল রয়েছে, এবং আমরা একটি AFTER INSERT Trigger তৈরি করতে চাই যাতে, যখনই নতুন কোনো বিক্রয়ের তথ্য ইনসার্ট করা হয়, তখন সেলস রিপোর্ট টেবিল আপডেট হয়।
CREATE TRIGGER update_sales_report_after_insert
AFTER INSERT
ON sales
FOR EACH ROW
BEGIN
UPDATE sales_report
SET total_sales = total_sales + NEW.amount
WHERE report_date = CURRENT_DATE;
END;
এই ট্রিগারটি তখনই কার্যকর হবে যখন নতুন বিক্রয়ের রেকর্ড ইনসার্ট করা হবে এবং এটি sales_report
টেবিলের total_sales
কলাম আপডেট করবে, যেখানে রিপোর্টের তারিখটি বর্তমান তারিখের সমান হবে।
ধরা যাক, একটি students
টেবিল রয়েছে, এবং আমরা একটি AFTER UPDATE Trigger তৈরি করতে চাই, যাতে student_score
কলামের মান আপডেট করার পর একটি লগ টেবিল এ পরিবর্তনটি রেকর্ড করা হয়।
CREATE TRIGGER log_score_update_after_update
AFTER UPDATE
ON students
FOR EACH ROW
WHEN (NEW.score <> OLD.score)
BEGIN
INSERT INTO score_log (student_id, old_score, new_score, update_time)
VALUES (NEW.id, OLD.score, NEW.score, CURRENT_TIMESTAMP);
END;
এই ট্রিগারটি তখনই কার্যকর হবে যখন কোনো ছাত্রের স্কোর আপডেট হবে এবং এটি সেই পরিবর্তনটি score_log
টেবিলে লগ করবে।
Apache Derby তে ট্রিগার তৈরি করা একটি শক্তিশালী ফিচার যা ডেটাবেসের কার্যক্রমকে স্বয়ংক্রিয়ভাবে পরিচালনা করতে সাহায্য করে। এটি বিভিন্ন ডেটাবেস অপারেশন যেমন INSERT
, UPDATE
, এবং DELETE
এর সাথে সংযুক্ত করা যেতে পারে। ট্রিগার ব্যবহার করে আপনি ডেটাবেসের অবস্থা সঠিকভাবে ম্যানেজ করতে এবং ডেটাবেসে কোনো পরিবর্তন ঘটলে তা কার্যকরভাবে ট্র্যাক করতে পারেন।
common.read_more